package cn.singno.bob.jpa.base;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;


/**
 *<p>名称：BaseService.java</p>
 * <p>描述：业务基础接口</p>
 * <pre>
 * 	该接口使用范围：RepositoryAwear下的所有子类
 * 
 * </pre>
 * @author 鲍建明
 * @date 2014年8月11日 下午3:14:54
 * @version 1.0.0
 */
public interface BaseService<T, ID extends Serializable>
{
	
	/**
	 * 动态查询单个对象
	 * @param searchEntity
	 * @return
	 */
	T findOne(T searchEntity);
	
	/**
	 * 
	 * <p>描述：通过ID来查询</p>
	 * <pre>
	 *    
	 * </pre>
	 * @param id
	 * @return
	 */
	T findOne(ID id);
	
	
	/**
	 * 保存实体
	 * @param entity
	 * @return
	 */
	T save(T entity);
	
	/**
	 * 保存一组数据 
	 * @param entities
	 */
	void save(Iterable<T> entities);
	
	/**
	 * 更新实体
	 * @param entity
	 * @return
	 */
	T updata(T entity);
	
	/**
	 * 通过主键删除
	 * @param id
	 */
	void delete(ID id);
	
	/**
	 * 删除一组
	 * @param entities
	 */
	void delete(Iterable<T> entities);
	
	/**
	 * 动态查询总数量
	 * @param searchEntity
	 * @return
	 */
	long count(T searchEntity);
	
	/**
	 * 查询总数量
	 * @return
	 */
	long count();
	
	/**
	 * 查询所有
	 * @return
	 */
	List<T> findAll();
	
	/**
	 * 查询所有带排序
	 * @return
	 */
	List<T> findAll(Sort sort);
	
	/**
	 * 分页查询
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	List<T> findList(int pageNow, int pageSize);
	
	/**
	 * 分页查询带排序
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	List<T> findList(int pageNow, int pageSize, Sort sort);
	
	
	/**
	 * 分页查询
	 * @param pageable
	 * @return
	 */
	List<T> findList(Pageable pageable);
	
	
	/**
	 * 动态参数加分页查询
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageable
	 * @return
	 */
	List<T> findList(T searchEntity, Pageable pageable);
	
	
	/**
	 * 动态参数加分页查询
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	List<T> findList(T searchEntity, int pageNow, int pageSize);
	
	
	/**
	 * 动态参数加分页查询带排序
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	List<T> findList(T searchEntity, int pageNow, int pageSize, Sort sort);
	
	
	
	
	/**
	 * 分页查询
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	Page<T> findPageList(int pageNow, int pageSize);
	
	/**
	 * 分页查询
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	Page<T> findPageList(int pageNow, int pageSize, Sort sort);
	
	/**
	 * 分页查询
	 * @param pageable
	 * @return
	 */
	Page<T> findPageList(Pageable pageable);
	
	/**
	 * 动态参数加分页查询
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageable
	 * @return
	 */
	Page<T> findPageList(T searchEntity, Pageable pageable);
	
	
	/**
	 * 动态参数加分页查询
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	Page<T> findPageList(T searchEntity, int pageNow, int pageSize);
	
	/**
	 * 动态参数加分页查询
	 * @param searchEntity   带搜索注解的实体对象
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	Page<T> findPageList(T searchEntity, int pageNow, int pageSize, Sort sort);
	
	
	
	
}
